#pragma once

#include "noncopyable.h"
#include "Timestamp.h"

#include <vector>
#include <unordered_map>

class Channel;
class EventLoop;

// muduo库中多路事件分发器的核心
class Poller
{
public:
    using ChannelList = std::vector<Channel*>;

    Poller(EventLoop* loop);
    virtual ~Poller() = default;

    // 给所有IO复用保留统一的接口
    // 在EventLoop的线程中使用，对epoll相当于epoll_wait，对poll相当于poll
    virtual Timestamp poll(int timeoutMs, ChannelList* activeChannels) = 0;  // 参数：超时时间，当前激活的channel，需要poll关注的channel
    // 更新channel对象感兴趣的事件
    virtual void updateChannel(Channel* channel) = 0;
    // 删除channel
    virtual void removeChannel(Channel* channel) = 0;

    // 判断当前poller里是否拥有某个channel
    virtual bool hasChannel(Channel* channel) const;

    // EventLoop可以通过该接口获取默认的IO复用的具体实现
    static Poller* newDefaultPoller(EventLoop* loop);

protected:  // 派生类可访问
    // map的key: sockfd(channel的成员变量之一)；value: sockfd所属的channel通道类型
    using ChannelMap = std::unordered_map<int, Channel*>;
    ChannelMap channels_;

private:  // 派生类不可访问
    EventLoop* ownerLoop_;  // 定义poller所属的事件循环EventLoop
};